/******************************************************
*  Copyright(c) pages.ilovezxl.top
*  FileName : hallib.h
*  Author : rivulet.dave
*  Description : HAL库头文件
*  Data : 2020-07-01
******************************************************/

#ifndef __HALLIB_H__
#define __HALLIB_H__

/*********************************************************************
 * INCLUDES
 */

#include "halcfg.h"

#ifdef __cplusplus
extern "C" {
#endif

/*********************************************************************
 *  EXTERNAL VARIABLES
 */

/*********************************************************************
 * MACROS
 */

#define H_FLAG_BLOCK    0x00000001
#define H_CTRL_RW       0x80000000  // ctrl命令字读写标志 0:写 1:读

/*********************************************************************
 * TYPES
 */

enum _hal_ctrl_cmd
{
    CTRL_CMD_NONE = 0,
    CTRL_RCVBUF,
    CTRL_SNDBUF,
    CTRL_GPIO,
    CTRL_UART_INIT,
    CTRL_ADC,
    CTRL_CAN_FILTER,
    CTRL_FLASH,
    CTRL_I2C,
    CTRL_RTC,
    CTRL_SPI,
    CTRL_TMR,
    CTRL_WDG,
    CTRL_CMD_MAX,
};

typedef void *hd_t;

/*********************************************************************
 * FUNCTIONS
 */

/**
 *   @Description: HAL层模块安装
 *   @param : NA
 *   @return:_OK/_ERR
 */
int32_t HAL_Install(void);

/**
 *   @Description: HAL层模块卸载
 *   @param : NA
 *   @return:_OK/_ERR
 */
int32_t HAL_Uninstall(void);

/**                                             
 *   @Description: 打开HAL层模块                
 *   @param : enModId - 入参，模块ID          
 *   @param : uiIdx - 入参，模块索引            
 *   @return: 模块描述符，0为无效              
 */                                             
hd_t HAL_Open(hwModId_t enModId, uint32_t uiIdx);

/**
 *   @Description: 关闭HAL层模块
 *   @param : hModuleDescriptor - 模块描述符
 *   @return:_OK/_ERR
 */
int32_t HAL_Close(hd_t hModuleDescriptor);

/**
 *   @Description: 锁定HAL层模块
 *   @param : hModuleDescriptor - 模块描述符
 *   @param : uiFlag - 特殊标记
 *   @return:_OK/_ERR
 */
int32_t HAL_Lock(hd_t hModuleDescriptor, uint32_t uiFlag);

/**
 *   @Description: 解锁HAL层模块
 *   @param : hModuleDescriptor - 模块描述符
 *   @param : uiFlag - 特殊标记
 *   @return:_OK/_ERR
 */
int32_t HAL_Unlock(hd_t hModuleDescriptor, uint32_t uiFlag);

/**
 *   @Description: 读取HAL层模块数据
 *   @param : hModuleDescriptor - 模块描述符
 *   @param : pUserBuf - 数据缓存
 *   @param : uiSize - 缓存大小
 *   @param : uiFlag - 特殊标记
 *   @return:_OK/_ERR 读取的数据长度
 */
int32_t HAL_Read(hd_t hModuleDescriptor, uint8_t *pUserBuf, uint32_t uiSize, uint32_t uiFlag);

/**
 *   @Description: 写入HAL层模块数据
 *   @param : hModuleDescriptor - 模块描述符
 *   @param : pUserData - 要写入的数据
 *   @param : uiSize - 要写入的数据长度
 *   @param : uiFlag - 特殊标记
 *   @return:_OK/_ERR 写入的数据长度
 */
int32_t HAL_Write(hd_t hModuleDescriptor, const uint8_t *pUserData, uint32_t uiSize, uint32_t uiFlag);

/**
 *   @Description: 一次性读取HAL层模块数据，不需要Open、Close操作
 *   @param : enModId - 模块ID
 *   @param : uiIdx - 模块内部索引
 *   @param : pUserBuf - 数据缓存
 *   @param : uiSize - 缓存大小
 *   @param : uiFlag - 标记
 *   @return:_OK/_ERR 读取的数据长度
 */
int32_t HAL_ReadOnce(hwModId_t enModId, uint32_t uiIdx, uint8_t *pUserBuf, uint32_t uiSize, uint32_t uiFlag);

/**
 *   @Description: 一次性写入HAL层模块数据，不需要Open、Close操作
 *   @param : enModId - 模块ID
 *   @param : uiIdx - 模块内部索引
 *   @param : pUserData - 要写入的数据
 *   @param : uiSize - 要写入的数据长度
 *   @param : uiFlag - 标记
 *   @return:_OK/_ERR 写入的数据长度
 */
int32_t HAL_WriteOnce(hwModId_t enModId, uint32_t uiIdx, const uint8_t *pUserData, uint32_t uiSize, uint32_t uiFlag);

/**
 *   @Description: HAL层模块参数控制
 *   @param : hModuleDescriptor - 模块描述符
 *   @param : uiCmdKey - 命令关键字
 *   @param : pValue - 数据
 *   @return:_OK/_ERR
 */
int32_t HAL_Ctrl(hd_t hModuleDescriptor, uint32_t uiCmdKey, void *pValue);


#ifdef __cplusplus
}
#endif /* end of __cplusplus */

#endif  // __HALLIB_H__


